/*
 * Copyright 2016 Wealth Inc. All rights reserved.
 */
 package com.wealth.order.web.controller;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.wealth.order.entity.Order;
import com.wealth.order.entity.OrderItem;
import com.wealth.order.entity.OrderPlat;
import com.wealth.order.enums.OrderStatusEnum;
import com.wealth.order.service.IOrderItemService;
import com.wealth.order.service.IOrderPlatService;
import com.wealth.order.service.IOrderService;
import com.wealth.system.entity.Corporation;
import com.wealth.system.entity.User;
import com.wealth.system.service.ShiroUser;
import com.wealth.system.web.controller.BaseController;

import iaas.enums.StatusEnum;
import iaas.utils.RedirectMessage;
import iaas.web.JqGridRequest;
import iaas.web.JqGridResponse;
import iaas.web.JqGridUtil;

/**
 * @author chan
 * @version 1.0
 * @since 1.0
 */
 
@Controller
@RequestMapping(value="/manage/order/orderPlat")
public class OrderPlatController extends BaseController{

	Logger logger = Logger.getLogger(OrderPlatController.class);
	
	@Autowired
	private IOrderPlatService orderPlatService;
	@Autowired
	private IOrderService orderService;
	@Autowired
	private IOrderItemService orderItemService;
	
	
	/**
	 * 所有RequestMapping方法调用前的Model准备方法, 实现Struts2 Preparable二次部分绑定的效果,先根据form的id从数据库查出Classify对象,再把Form提交的内容绑定到该对象上。
	 * 因为仅update()方法的form中有id属性，因此仅在update时实际执行.
	 */
	@ModelAttribute
	public void init(@RequestParam(value = "id", defaultValue = "-1") Long id, Model model) {
		try{
			if (id != -1) {
				OrderPlat orderPlat = orderPlatService.get(id);
				model.addAttribute("orderPlat", orderPlat);
			}
		}catch(Exception e){
			logger.error("初始化错误", e);
		}
	}
	
	/**
	 * 列表
	 */
	@RequestMapping(value="/list",method = RequestMethod.GET)
	public String list(Model model){
		try{
			Long corpid = ShiroUser.getInstance().getUser().getCorp().getId();
			model.addAttribute("corpid", corpid);
			model.addAttribute("orderStatusEnum", OrderStatusEnum.values());
			
			return "order/orderPlat/list";
		} catch (Exception e) {
			logger.error("列表页面错误", e);
			return "system/500";
		}
	}
	
	
	/**
	 * 列表ajax查询数据
	 */
	@RequestMapping(value="/list",method = RequestMethod.POST)
	@ResponseBody
	public JqGridResponse getJson(Model model,JqGridRequest request) {
		try{

			Long corpid = ShiroUser.getInstance().getUser().getCorp().getId();
			
			Page<OrderPlat> page = orderPlatService.getOrderPlat(corpid, request, OrderPlat.class);
			
			return JqGridUtil.getJqGrirdResponse(page);
		}catch(Exception e){
			logger.error("列表错误！", e);
			return null;
		}
	}
	
	
	/**
	 * 详情
	 */
	@RequestMapping(value="/{id}",method = RequestMethod.GET)
	public String infoForm(Model model,@PathVariable("id") Long id){
		try{
			//订单信息
			OrderPlat orderPlat = orderPlatService.get(id);
			model.addAttribute("orderPlat", orderPlat);
			//子订单
			List<Map<Object, Object>> ordermaps=new ArrayList<Map<Object,Object>>();
			
			List<Order> orders=orderService.findByOrderPlatId(orderPlat.getId());
			for (int i = 0; i < orders.size(); i++) {
				Map<Object, Object> maps=new HashMap<Object, Object>();
				//订单明细
				List<OrderItem> orderItems=orderItemService.findByOrderId(orders.get(i).getId()); 
				maps.put("order", orders.get(i));
				maps.put("orderItems", orderItems);
				ordermaps.add(maps);
			}
			
			model.addAttribute("ordermaps", ordermaps);
			//订单状态
			model.addAttribute("OrderStatusEnum", OrderStatusEnum.values());
			return "order/orderPlat/info";
		}catch(Exception e){
			logger.error("详情页面错误,id="+id, e);
			return "system/500";
		}
	}
	
	/**
	 * 备注
	 */
	@RequestMapping(value="/remarks/{id}",method = RequestMethod.GET)
	public String remarks(Model model,@PathVariable("id") Long id){
		try{
			//订单信息
			OrderPlat orderPlat = orderPlatService.get(id);
			model.addAttribute("orderPlat", orderPlat);
			//子订单
			List<Map<Object, Object>> ordermaps=new ArrayList<Map<Object,Object>>();
			
			List<Order> orders=orderService.findByOrderPlatId(orderPlat.getId());
			for (int i = 0; i < orders.size(); i++) {
				Map<Object, Object> maps=new HashMap<Object, Object>();
				//订单明细
				List<OrderItem> orderItems=orderItemService.findByOrderId(orders.get(i).getId()); 
				maps.put("order", orders.get(i));
				maps.put("orderItems", orderItems);
				ordermaps.add(maps);
			}
			
			model.addAttribute("ordermaps", ordermaps);
			//订单状态
			model.addAttribute("OrderStatusEnum", OrderStatusEnum.values());
			return "order/orderPlat/remarks";
		}catch(Exception e){
			logger.error("详情页面错误,id="+id, e);
			return "system/500";
		}
	}
	
	/**
	 * 备注
	 */
	@RequestMapping(value="/remarks",method = RequestMethod.POST)
	public String remarkForm(Model model,OrderPlat orderPlat,RedirectAttributes redirectAttributes){
		try{
			orderPlatService.save(orderPlat);
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipSuccess("备注成功"));
			return "redirect:/manage/order/orderPlat/list";
		}catch(Exception e){
			logger.error("订单备注错误", e);
			return "system/500";
		}
	}
	
	
	/**
	 * 创建页面
	 */
	@RequestMapping(value="/create",method = RequestMethod.GET)
	public String createForm(){
		try {
			return "order/orderPlat/create";
		} catch (Exception e) {
			logger.error("创建页面错误", e);
			return "system/500";
		}
	}
	
	/**
	 * 创建
	 */
	@RequestMapping(value="/create",method = RequestMethod.POST)
	public String create(Model model,OrderPlat entity,RedirectAttributes redirectAttributes){
		try {
			User user = ShiroUser.getInstance().getUser();
			
			entity.setCorp(user.getCorp());
			entity.setCreateTime(new Date());
			orderPlatService.save(entity);
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipSuccess("创建成功"));
			return "redirect:/manage/order/orderPlat/list";
		} catch (Exception e) {
			logger.error("创建错误", e);
			return "system/500";
		}
	}
	
	/**
	 * 编辑页面
	 */
	@RequestMapping(value="/update/{id}",method = RequestMethod.GET)
	public String setUpdateForm(Model model,@PathVariable("id") Long id){
		try{
			OrderPlat orderPlat = orderPlatService.get(id);
			model.addAttribute("orderPlat", orderPlat);
			return "order/orderPlat/update";
		}catch(Exception e){
			logger.error("编辑页面错误,id="+id, e);
			return "system/500";
		}
	}
	
	/**
	 * 修改信息
	 */
	@RequestMapping(value="/update/{id}",method = RequestMethod.POST)
	public String update(@PathVariable("id") Long id,@ModelAttribute("orderPlat") OrderPlat orderPlat,RedirectAttributes redirectAttributes){
		try{
			orderPlatService.save(orderPlat);
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipSuccess("编辑成功"));
			return "redirect:/manage/order/orderPlat/list";
		}catch(Exception e){
			logger.error("编辑错误,id="+id, e);
			return "system/500";
		}
	}
	
	/**
	 * 删除（逻辑删除）
	 */
	@RequestMapping(value="/delete/{id}",method = RequestMethod.GET)
	public String delete(@PathVariable Long id,RedirectAttributes redirectAttributes){
		try{
			orderPlatService.deleteLogical(id);
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipSuccess("删除成功"));
			return "redirect:/manage/order/orderPlat/list";
		}catch(Exception e){
			logger.error("删除错误,id="+id,e);
			return "system/500";
		}
	}
	
	/**
	 * 停用
	 */
	@RequestMapping(value="/disable/{id}",method = RequestMethod.GET)
	public String disable(@PathVariable Long id,RedirectAttributes redirectAttributes){
		try{
			orderPlatService.updateStatus(id, StatusEnum.STOP.getValue());
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipWarning("停用成功"));
			return "redirect:/manage/order/orderPlat/list";
		}catch(Exception e){
			logger.error("停用错误,id="+id,e);
			return "system/500";
		}
	}
	
	/**
	 * 启用
	 */
	@RequestMapping(value="/enable/{id}",method = RequestMethod.GET)
	public String enable(@PathVariable Long id,RedirectAttributes redirectAttributes){
		try{
			orderPlatService.updateStatus(id, StatusEnum.NORMAL.getValue());
			redirectAttributes.addFlashAttribute("message", RedirectMessage.setShowTipWarning("启用成功"));
			return "redirect:/manage/order/orderPlat/list";
		}catch(Exception e){
			logger.error("启用错误,id="+id,e);
			return "system/500";
		}
	}
	
	/**
	 * 导出订单
	 */
	@RequestMapping(value="/export",method = RequestMethod.GET)
	public void export(HttpServletResponse response,String startTime,String endTime,Integer paystatus){
		try {
			
			HSSFWorkbook wb = orderPlatService.exportFile(startTime, endTime, paystatus);
			//数据类型
	        response.setContentType("application/vnd.ms-excel");   
	        //定义文件类型和文件名
	        response.setHeader("Content-disposition", "attachment;filename="+System.currentTimeMillis()+".xls");    
	        //写入
	        OutputStream ouputStream = response.getOutputStream();    
	        wb.write(ouputStream);    
	        ouputStream.flush();    
	        ouputStream.close();  
			
		} catch (Exception e) {
			logger.error("创建页面错误", e);
			
		}
	}
	
	/**
	 * 打印订单页面
	 */
	@RequestMapping(value="/print/{id}", method = RequestMethod.GET)
	public String printForm(Model model,@PathVariable Long id){
		try{
			OrderPlat order = orderPlatService.get(id);
			model.addAttribute("order", order);
			Corporation corp = ShiroUser.getInstance().getUser().getCorp();
			model.addAttribute("corp", corp);
			return "order/orderPlat/print";
		}catch(Exception e){
			logger.error("打印订单页面错误,订单id="+id, e);
			return "system/500";
		}
	}
	
	
}